// 点击Buttton, 在光标处插入HTML
/**
 * 
 * @param {editDouId} 编辑DOM的id 
 * 限制：获取光标位置，仅限button按钮、a带有href属性
 * 示例：const  xxx = new CursorPositionManager()，保存变量xxx。
 * doucument.getElementById('button').onClick = function() {
 *      xxx.savePosition()方法
 *      // do something..., after: 
 *      xxx.positionAppend(`这里是插入内容`)
 * }
 */
export class CursorPositionManager {
    constructor(editDouId) {
        this.editDouId = editDouId
        this.position = null
    }

    // 获取光标结束位置
    getEndPosition() {
        var selectTarget = window.getSelection()
        if(selectTarget.focusNode == null) {
            return
        }
        var range = selectTarget.getRangeAt(0)
        var endOffset = range.endOffset
        var endContainer = range.endContainer
        // console.log( "#### range %o", endContainer)
        return {
            endContainer,
            endOffset,
        }
    }

    // 设置光标结束位置
    setEndPosition(endPosition) {
        if(endPosition == null){
            return
        }
        var range = document.createRange() //创建选择对象
        range.setEnd(endPosition.endContainer, endPosition.endOffset)
        range.collapse(false)
        var sel = window.getSelection()
        sel.removeAllRanges()
        sel.addRange(range)
    }

    // 保存光标位置
    savePosition() {
        //保存光标结束位置
        var endPosition = this.getEndPosition()
        var fullElememt = document.getElementById(this.editDouId)
        //如果焦点不在富文本上，就在富文本上获取焦点
        if(!(endPosition && endPosition.endContainer && endPosition.endContainer.parentElement && endPosition.endContainer.parentElement.id == this.editDouId)){
            // console.log("当前没有焦点, 设置并获取富文本焦点")
            fullElememt.focus()
            endPosition = this.getEndPosition()
        }
        // console.log("插入图片操作, 保存的光标位置", endPosition)
        this.position = endPosition
    }

    // 在光标位置填充HTML
    positionAppend(html) {
        // console.log('html', html)
        //先获取到光标
        this.setEndPosition(this.position)
        document.execCommand('insertHTML', false,  html)
    }
}